#pragma once
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/async.h>
#include <iostream>
#include <memory>

namespace lcl
{
    // mode - 运行模式： true-发布模式； false-debug模式
    std::shared_ptr<spdlog::logger> g_default_logger;
    void Init_Logger(bool mode, const std::string &file, int level)
    {
        // 根据mode来判断是调试模式还是发布模式
        if (mode == false)
        {
            // debug模式，创建标准输出日志器，输出等级为最低
            g_default_logger = spdlog::stdout_color_mt("logger");
            g_default_logger->set_level(spdlog::level::level_enum::trace);
            g_default_logger->flush_on(spdlog::level::level_enum::trace);
        }
        else
        {
            // 发布模式，创建输出到文件的日志器，输出等级为level
            g_default_logger = spdlog::basic_logger_mt("logger", file);
            g_default_logger->set_level((spdlog::level::level_enum)level);
            g_default_logger->flush_on((spdlog::level::level_enum)level);
        }
        g_default_logger->set_pattern("[%n][%H:%M:%S][%t][%-8l]%v");
    }
#define LOG_TRACE(format, ...) lcl::g_default_logger->trace(std::string("[{}:{}]") + format, __FILE__, __LINE__, ##__VA_ARGS__);
#define LOG_DEBUG(format, ...) lcl::g_default_logger->debug(std::string("[{}:{}]") + format, __FILE__, __LINE__, ##__VA_ARGS__);
#define LOG_INFO(format, ...) lcl::g_default_logger->info(std::string("[{}:{}]") + format, __FILE__, __LINE__, ##__VA_ARGS__);
#define LOG_WARN(format, ...) lcl::g_default_logger->warn(std::string("[{}:{}]") + format, __FILE__, __LINE__, ##__VA_ARGS__);
#define LOG_ERROR(format, ...) lcl::g_default_logger->error(std::string("[{}:{}]") + format, __FILE__, __LINE__, ##__VA_ARGS__);
#define LOG_FATAL(format, ...) lcl::g_default_logger->critical(std::string("[{}:{}]") + format, __FILE__, __LINE__, ##__VA_ARGS__);
}